package config

import (
	"fmt"
	"github.com/spf13/viper"
	"gopkg.in/ini.v1"
)

var Conf = new(AppConfig)

//App配置映射
type AppConfig struct {
	*ServerPort  `json:"server" ini:"server"`
	*LogConfig   `json:"log" ini:"log"`
	*MysqlConfig `json:"mysql" ini:"mysql"`
	*RedisConfig `json:"redis" ini:"redis"`
}

//结构体中的字段，相同类型的字段可以放在相邻的位置，可以降低存储空间(go中的内存对齐)
//Mysql配置映射

type ServerPort struct {
	Port int `json:"port" ini:"port"`
}

type MysqlConfig struct {
	Host         string `json:"host" ini:"host"`
	Port         int    `json:"port" ini:"port"`
	User         string `json:"user" ini:"username"` //web.ini文件中的是叫username，tag中需要相应修改，否则是找不到用户名的
	DB           string `json:"db" ini:"db"`
	Password     string `json:"password" ini:"password"`
	MaxOpenConns int    `json:"max_open_conns" ini:"max_open_conns"`
	MaxIdleConns int    `json:"max_idle_conns" ini:"max_idle_conns"`
}

//Redis配置映射
type RedisConfig struct {
	Host     string `json:"host" ini:"host"`
	Port     int    `json:"port" ini:"port"`
	PassWord string `json:"password" ini:"password"`
	DB       int    `json:"db" ini:"db"`
}

//日志配置的映射
type LogConfig struct {
	Level      string `json:"level" ini:"level"`
	Filename   string `json:"filename" ini:"filename"`
	MaxSize    int    `json:"max_size" ini:"max_size"`
	MaxAge     int    `json:"max_age" ini:"max_age"`
	MaxBackups int    `json:"max_backups" ini:"max_backups"`
}

//定义加载文件，映射到结构体的函数
func LoadFromFile(cfgConfig string) (err error) {
	return ini.MapTo(Conf, cfgConfig)
}

//配置viper

func Init() error {
	viper.SetConfigName("conf")          // 配置文件名称(无扩展名)
	viper.SetConfigType("yaml")          // 如果配置文件的名称中没有扩展名，则需要配置此项
	viper.AddConfigPath("/etc/appname/") // 查找配置文件所在的路径
	err := viper.ReadInConfig()          // 查找并读取配置文件
	if err != nil {                      // 处理读取配置文件的错误
		panic(fmt.Errorf("Fatal error conf file: %s \n", err))
	}
	return err
}
